#include <iostream>
#include <fstream>
#include <cstdio>
#include <sstream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <deque>
#include <ctime>
#include <cstdlib>

using namespace std;

#define sz(x) ((int)((x).size()))

typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;

const double EPS = 1e-9;

const int MAXN = (int)(5e4) + 10;

int n;
int x[MAXN], r[MAXN], xx[MAXN], rr[MAXN];
double h[MAXN];
int st[MAXN], nst;

void solve() {
	for (int i = 0; i < n; i++) {
		scanf("%d%d", &x[i], &r[i]);
		xx[i] = x[i];
		rr[i] = r[i];
	}
	for (int i = 0; i < n; i++) {
		while (nst > 0 && r[i] >= r[st[nst - 1]] + x[i] - x[st[nst - 1]]) nst--;
		if (nst == 0 || r[st[nst - 1]] < r[i] + x[i] - x[st[nst - 1]]) {
			st[nst++] = i;
		}
	}
	for (int i = 0; i < nst; i++) {
		x[i] = xx[st[i]];
		r[i] = rr[st[i]];
	}
	n = nst;
	for (int i = 0; i < n - 1; i++) {
		double p = x[i + 1] - x[i] + r[i] + r[i + 1];
		p *= 0.5;
		double s = sqrt(p * (p - x[i + 1] + x[i]) * (p - r[i]) * (p - r[i + 1]));
		h[i] = s * 2.0 / (x[i + 1] - x[i]);
	}
	double lf = 0.0;
	double rg = 1e5 + EPS;
	for (int it = 0; it < 75; it++) {
		double md = (lf + rg) / 2;
		bool ok = false;
		for (int i = 0; i < n; i++) {
			if (r[i] * r[i] >= 2.0 * md * md) {
				ok = true;
				break;
			}
			if (i < n - 1 && h[i] > md - EPS) {
				double X = sqrt(r[i] * 1.0 * r[i] - md * md);
				double Y = sqrt(r[i + 1] * 1.0 * r[i + 1] - md * md);
				if (X + x[i + 1] - x[i] + Y >= 2.0 * md) {
					ok = true;
					break;
				}
			}
		}
		if (ok)
			lf = md;
		else
			rg = md;
	}
	printf("%.10lf\n", 2.0 * lf);
}

int main() {
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);

	while (scanf("%d", &n) == 1 && n != 0) {
		solve();
	}

	return 0;
}
